package controller

import (
	"net/http"
	"strconv"

	"image-sever-grpc/image-web-server/middleware"
	response "image-sever-grpc/image-web-server/models"
	service "image-sever-grpc/image-web-server/services"

	"github.com/gin-gonic/gin"
)

// ShareController 分享控制器，处理分享相关的HTTP请求
type ShareController struct {
	shareService *service.ShareService // 分享服务层实例，用于业务逻辑处理
}

// GetUserShares 获取用户的所有分享记录
// 请求方式：GET
// 功能：验证用户身份后，获取该用户的所有分享记录，支持分页
func (c *ShareController) GetUserShares(ctx *gin.Context) {
	// 从中间件获取当前登录用户
	user, err := middleware.GetUser(ctx)
	if err != nil || user == nil {
		// 未授权访问，返回401错误
		response.Error(ctx.Writer, http.StatusUnauthorized, "未授权访问")
		return
	}
	// 解析分页参数，默认第1页，每页10条，限制最大每页50条
	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
	if page < 1 {
		page = 1
	}
	if limit < 1 || limit > 50 {
		limit = 10
	}

	// 调用服务层获取用户分享记录
	shares, total, err := c.shareService.GetUserShares(user.ID, page, limit)
	if err != nil {
		// 服务层处理失败，返回500错误
		response.Error(ctx.Writer, http.StatusInternalServerError, "获取分享记录失败")
		return
	}

	// 构建包含分页信息的响应数据
	data := gin.H{
		"shares": shares,
		"pagination": gin.H{
			"total": total,
			"page":  page,
			"limit": limit,
		},
	}
	// 返回成功响应
	response.Success(ctx.Writer, data)
}

// GetUploadSTS 获取上传用的STS临时凭证
// 请求方式：GET
// 请求参数：expiration: 可选，凭证有效期（秒），默认3600秒（1小时）
func (c *ShareController) GetUploadSTS(ctx *gin.Context) {
	// 1. 获取当前登录用户
	user, err := middleware.GetUser(ctx)
	if err != nil || user == nil {
		response.Error(ctx.Writer, http.StatusUnauthorized, "未授权访问")
		return
	}

	// 2. 解析有效期参数（默认1小时）
	expirationStr := ctx.DefaultQuery("expiration", "3600")
	expiration, err := strconv.Atoi(expirationStr)
	if err != nil || expiration <= 0 || expiration > 86400 { // 限制最大有效期为24小时
		response.Error(ctx.Writer, http.StatusBadRequest, "有效期参数错误（需为1-86400秒）")
		return
	}

	// 3. 调用服务层获取STS凭证
	credential, err := c.shareService.GetUploadCredentials(user.ID, user.WpsUID, expiration)
	if err != nil {
		response.Error(ctx.Writer, http.StatusInternalServerError, "获取上传凭证失败: "+err.Error())
		return
	}

	// 4. 返回成功响应
	response.Success(ctx.Writer, credential, "获取上传凭证成功")
}
